package models

import scala.collection.mutable.ArrayBuffer
import org.joda.time.DateTime
import org.joda.time.LocalDate
import canchas.Cancha

	/**
	 * INV-REP: El sistema debe contener por lo menos 1 cancha.
	 */
class RepositorioCanchas {
	   
  val canchas: ArrayBuffer[Cancha] = new ArrayBuffer[Cancha]

  /**
   * @param la cancha que se quiere agregar al sistema
   * Agrega una cancha al sistema
   */
  def agregarCancha(c: Cancha) = canchas += c
  
  /**
   * @param dia a preguntar, hora, cantidad de horas
   * Encuentra una cancha (sin importar de que tipo) 
   * que se pueda reservar para un dia, hora y cant de horas determinado
   */
  def canchaDisponibleParaReserva(r: Reserva): Cancha = {
    val cancha = canchas.find(c => c.libreParaReservar(r) && c.iluminacionSuficiente(r))
    if(cancha != None) 
      cancha.get
    else throw new RuntimeException("No hay cancha disponible para la reserva que se intenta realizar")
  }

  /**
   * @return la facturazion total de todas las canchas.
   * Suma la facturazion de cada cancha, las suma y las devuelve.
   */
  def facturacionTotal(): Float = 
    canchas.foldLeft(0f)((total,c) => total + c.facturacionTotal())
  
  /**
   * @param una fecha
   * @return las canchas que tienen reservas para el dia consultado.
   */
  def canchasReservadasElDia(d: LocalDate) =
    canchas.filter(c => c.tieneReservasParaElDia(d))
    
  /**
   * @param una fecha
   * @return todas las reservas de todas las canchas para el dia consultado.
   */
  def reservasParaElDia(d: LocalDate) =
    canchas.foldLeft(ArrayBuffer[Reserva]())((cs,c) => cs ++= c.reservasDelDia(d))
  
    
  /**
   * @pre el repositorio debe tener por lo menos una cancha
   * @return devuelve la cancha que tiene mas reservas echas
   */
  def canchaConMasReservas(): Cancha = 
    canchas.maxBy(c => c.reservas.size)
  
}